package cn.wit.sst.mapper;

import cn.wit.sst.domain.Score;
import cn.wit.sst.dto.ScoreRankDto;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Param;

public interface ScoreMapper {
    int deleteByPrimaryKey(Long id);

    int insert(Score record);
    int insertBatch(List<Score> scores);

    Score selectByPrimaryKey(Long id);

    List<Score> selectAll();

    int updateByPrimaryKey(Score record);

    /**
     *  查询各科成绩
     *  输入：学生id、开始学年、学期
     *  输出：学科、成绩的列表
     */
    List<Map<String, Object>> getStudentScoresForSemester(
    		@Param("id") Long id,
    		@Param("year") int startYear,
    		@Param("semester") int semester);

    /**
     *  查询某个班级所有课程的分数排名
     *  输入：专业、开始学年、学期、班级、课程
     *  输出：已排序的分数集合（由高到低）、按课程分组
     *  注意：mysql排名sql较为复杂、需需要在查询结束后，在代码里完成排名的计算
     *
     */
    List<ScoreRankDto> getScoreRanksForClazz(
    		@Param("mid") Long mid,
    		@Param("year") int year,
    		@Param("examYear") int examYear,
    		@Param("semester") int semester,
    		@Param("clazz") int clazz);

    /**
     *  查询某个班级所有课程的分数排名
     *  输入：专业、开始学年、班级
     *  输出：已排序的分数集合（由高到低），按年份、学期、课程分组
     *
     */
    List<ScoreRankDto> getAllScoreRanksForClazz(
    		@Param("mid") Long mid,
    		@Param("year") int year,
    		@Param("clazz") int clazz);

    /**
     *  查询某个班级某门课程的分数排名
     *  输入：专业、开始学年、学期、班级、课程
     *  输出：已排序的分数集合（由高到低）
     *  注意：mysql排名sql较为复杂、需需要在查询结束后，在代码里完成排名的计算
     *
     */
    List<ScoreRankDto> getCourseScoreRanksForClazz(
    		@Param("mid") Integer mid,
    		@Param("year") int startYear,
    		@Param("examYear") int examYear,
    		@Param("semester") int semester,
    		@Param("clazz") int clazz,
    		@Param("cid") Integer cid);

    List<ScoreRankDto> getScoreRanksForMajor(
			@Param("mid") Long mid,
			@Param("year") int startYear,
			@Param("examYear") int examYear,
			@Param("semester") int semester);

    List<ScoreRankDto> getScoreRanksForCollege(
			@Param("year") int startYear,
			@Param("examYear") int examYear,
			@Param("semester") int semester);

}